/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dailynewsreader.view;

import java.awt.Color;
import java.awt.Desktop;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JEditorPane;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;

/**
 * Az rss entry-ket reprezentáló GUI elem
 * @author Várhegyi Tamás
 */
public final class RSSEntry extends JPanel{

    /**
     * Olvasott-e az entry
     */
    private boolean read = false;
        
    /**
     * A model rss entry
     */
    private dailynewsreader.model.RSSEntry content;
    
    /**
     * Az rss entry-hez tartozó url
     */
    private String link;
    
    /**
     * A html tartalom css stílus beállításai
     */
    private String htmlStyle;
    
    /**
     * A tartalmat megjelenítő objektum
     */
    private JEditorPane container;
   
    /**
     * RSS entry konstruktora
     */
    public RSSEntry() {  
        initComponents();  
        
        addHyperlinkListener(new HyperlinkListener() {    
            @Override
            public void hyperlinkUpdate(HyperlinkEvent e) {
             if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
                clickOnHyperlink(e.getURL());
             }   
            }        
      });
        add(container);
    }
                
    /**
     * A html tartalom linkjeire való kattintás kezelése
     * @param url A link url-je
     */
    private void clickOnHyperlink(URL url)
    {
        int option = JOptionPane.showConfirmDialog(this, "Megnyitja a böngészőben?", "Link", JOptionPane.YES_NO_OPTION);
                 
        if(Desktop.isDesktopSupported() && option == JOptionPane.YES_OPTION) {     
            try {
                Desktop.getDesktop().browse(url.toURI());   
            } catch (Exception ex) {
                Logger.getLogger(RSSEntry.class.getName()).log(Level.SEVERE, null, ex);
            }   
        }
    }    
    
    /**
     * A GUI elemek inicializálása
     */
    private void initComponents(){
        this.container = new JEditorPane();
        setBackground(Color.white);
        setEditable(false);
        
        this.container.setContentType("text/html");  
        
        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(this);
        setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(            
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(container, javax.swing.GroupLayout.PREFERRED_SIZE, 700, javax.swing.GroupLayout.PREFERRED_SIZE))                    
                .addContainerGap(0, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE))                    
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(container, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(0, Short.MAX_VALUE))
        );     
        
        this.htmlStyle = "<style>a {color: inherit; text-decoration: none} span.new {color: red;} span.footer{font-size: 10px; margin-top: 10px}</style>";
    }
    
    /**
     * Beállítjuk a model tartalmat a view-nak
     * @param entry RSSEntry objektum
     */
    public void setContent(dailynewsreader.model.RSSEntry entry){
        this.content = entry;
        this.read = entry.isIsRead();
        StringBuilder sb = new StringBuilder();
        sb.append(this.htmlStyle);
        if (!this.read){
            sb.append("<span class=\"new\">Új</span>");
        }
        sb.append(entry.toHTML());
        this.container.setText(sb.toString());
    }
    
    /**
     * Olvasott-e már a bejegyzés vagy sem
     * @return Igaz, ha olvasott, hamis különben
     */
    public boolean isRead(){
        return this.read;
    }
    
    /**
     * Olvasottság beállítása a bejegyzéshez
     * @param isRead olvasott-e
     */
    public void setIsRead(boolean isRead){
        this.read = isRead;
        this.content.setIsRead(isRead);
        this.setContent(content);
    }
       
    /**
     * RSS bejegyzés url-jének beállítása
     * @param url Url cím
     */
    public void setLink(String url){
        link = url;
    }

    /**
     * Hiperhivatkozás kezelése
     * @param hyperlinkListener 
     */
    void addHyperlinkListener(HyperlinkListener hyperlinkListener) {
        this.container.addHyperlinkListener(hyperlinkListener);
    }

    /**
     * Módosítható-e a tartalom vagy sem
     * @param b Módosítható-e
     */
    void setEditable(boolean b) {
        this.container.setEditable(b);
    }

    /**
     * Tartalom típusának beállítása
     * @param texthtml Típus
     */
    void setContentType(String texthtml) {
        this.container.setContentType(texthtml);
    }  
}
